﻿using System;
using System.Collections.Generic;
using System.Reflection;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.IO;
using System.Drawing;

namespace Framework.Util
{
    public class Geral
    {
        #region Regions

        #region Atributos

        #endregion

        #region Construtores

        #endregion

        #region Propriedades

        #endregion

        #region Métodos

        #endregion

        #region Eventos

        #endregion

        #endregion

        #region Métodos

        

        /// <summary>
        /// Método responsável por gerar cor aleatóriamente
        /// </summary>
        /// <returns>String</returns>
        public static Color GerarCor()
        {
            Color cor = new Color();

            Color[] cCor = new Color[]{Color.Aqua, Color.Black, Color.Blue, Color.Fuchsia, Color.Gray,
                                         Color.Green, Color.Lime, Color.Maroon, Color.Navy, Color.Olive,
                                         Color.Purple, Color.Red, Color.Silver, Color.Teal, Color.Yellow};

            try
            {
                Random r = new Random();
                cor = Color.FromArgb(r.Next(0, cCor.Length));
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return cor;
        }
        
        /// <summary>
        /// Método responsável por gerar uma string automática
        /// </summary>
        /// <returns>String</returns>
        public static string GerarString()
        {
            string novaString = string.Empty;

            try
            {
                novaString = Path.GetRandomFileName();
                novaString = novaString.Replace(".", "");
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return novaString;
        }

        #region Descriptions

        /// <summary>
        /// Método responsável por retornar descrições com acentos e espaços em enumeradores (Descriptions)
        /// </summary>
        /// <param name="type">tipo do enumerador</param>
        /// <returns>List com as descrições</returns>
        public static string GetDescription(Enum value)
        {
            FieldInfo fi = value.GetType().GetField(value.ToString());
            DescriptionAttribute[] attributes =
                  (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
            return (attributes.Length > 0) ? attributes[0].Description : fi.ToString();
        }

        /// <summary>
        /// Método responsável por retornar descrições com acentos e espaços em enumeradores (Descriptions)
        /// </summary>
        /// <param name="type">tipo do enumerador</param>
        /// <returns>List com as descrições</returns>
        public static List<string> GetDescriptions(System.Type type)
        {
            List<string> descricoes = new List<string>();
            FieldInfo[] values = type.GetFields();
            for (int i = 1; i < values.Length; i++)
            {
                DescriptionAttribute[] attributes =
                      (DescriptionAttribute[])values[i].GetCustomAttributes(typeof(DescriptionAttribute), false);
                descricoes.Add((attributes.Length > 0) ? attributes[0].Description : values[i].ToString());
            }

            return descricoes;
        }

        /// <summary>
        /// Retorna a descrição os enumeradores com o seu "ToString()" como chave
        /// </summary>
        /// <param name="type">tipo do enumerador</param>
        /// <returns>Dictionary com as descrições e chaves</returns>
        public static Dictionary<string, string> GetKeys_Descriptions(System.Type type)
        {
            Dictionary<string, string> descricoes = new Dictionary<string, string>();
            FieldInfo[] values = type.GetFields();
            for (int i = 1; i < values.Length; i++)
            {
                DescriptionAttribute[] attributes =
                    (DescriptionAttribute[])values[i].GetCustomAttributes(typeof(DescriptionAttribute), false);
                descricoes.Add(values[i].GetValue(null).ToString(), (attributes.Length > 0) ? attributes[0].Description : values[i].ToString());
            }
            return descricoes;
        }

        #endregion

        #region Validações

        public static bool ValidaCPF(string vrCPF)
        {
            string valor = vrCPF.Replace(".", "");
            valor = valor.Replace("-", "");

            if (valor.Length != 11)
                return false;

            bool igual = true;

            for (int i = 1; i < 11 && igual; i++)
                if (valor[i] != valor[0])
                    igual = false;

            if (igual || valor == "12345678909")
                return false;

            int[] numeros = new int[11];

            for (int i = 0; i < 11; i++)
                numeros[i] = int.Parse(
                  valor[i].ToString());

            int soma = 0;

            for (int i = 0; i < 9; i++)
                soma += (10 - i) * numeros[i];

            int resultado = soma % 11;

            if (resultado == 1 || resultado == 0)
            {
                if (numeros[9] != 0)
                    return false;
            }
            else if (numeros[9] != 11 - resultado)
                return false;

            soma = 0;

            for (int i = 0; i < 10; i++)
                soma += (11 - i) * numeros[i];

            resultado = soma % 11;

            if (resultado == 1 || resultado == 0)
            {
                if (numeros[10] != 0)
                    return false;
            }
            else
                if (numeros[10] != 11 - resultado)
                    return false;

            return true;
        }

        public static bool ValidaCNPJ(string vrCNPJ)
        {
            string CNPJ = vrCNPJ.Replace(".", "");
            CNPJ = CNPJ.Replace("/", "");
            CNPJ = CNPJ.Replace("-", "");

            int[] digitos, soma, resultado;
            int nrDig;
            string ftmt;
            bool[] CNPJOk;

            ftmt = "6543298765432";
            digitos = new int[14];
            soma = new int[2];
            soma[0] = 0;
            soma[1] = 0;
            resultado = new int[2];
            resultado[0] = 0;
            resultado[1] = 0;
            CNPJOk = new bool[2];
            CNPJOk[0] = false;
            CNPJOk[1] = false;

            try
            {
                for (nrDig = 0; nrDig < 14; nrDig++)
                {
                    digitos[nrDig] = int.Parse(
                        CNPJ.Substring(nrDig, 1));

                    if (nrDig <= 11)
                        soma[0] += (digitos[nrDig] *
                          int.Parse(ftmt.Substring(
                          nrDig + 1, 1)));

                    if (nrDig <= 12)
                        soma[1] += (digitos[nrDig] *
                          int.Parse(ftmt.Substring(
                          nrDig, 1)));
                }

                for (nrDig = 0; nrDig < 2; nrDig++)
                {
                    resultado[nrDig] = (soma[nrDig] % 11);

                    if ((resultado[nrDig] == 0) || (
                         resultado[nrDig] == 1))
                        CNPJOk[nrDig] = (
                        digitos[12 + nrDig] == 0);
                    else
                        CNPJOk[nrDig] = (
                        digitos[12 + nrDig] == (
                        11 - resultado[nrDig]));
                }

                return (CNPJOk[0] && CNPJOk[1]);
            }
            catch
            {
                return false;
            }
        }

        public static bool ValidaEmail(string email)
        {
            Regex rg = new Regex(@"^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$");
            return rg.IsMatch(email);
        }

        public static bool ValidaURL(string url)
        {
            Regex reg = new Regex(@"^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&amp;%\$#\=~])*[^\.\,\)\(\s]$");
            return reg.IsMatch(url);
        }

        public static bool ValidaData(string data)
        {
            try
            {
                DateTime vlrData = Convert.ToDateTime(data);

                if (vlrData >= DateTime.Now)
                    return false;
            }
            catch
            {
                return false;
            }

            return true;
        }

        public static bool ValidaData(string dataInicial, string dataFinal)
        {
            DateTime vlrDataIni = Convert.ToDateTime(dataInicial);
            DateTime vlrDataFim = Convert.ToDateTime(dataFinal);

            if (vlrDataIni >= vlrDataFim)
                return false;

            return true;
        }

        #endregion

        #endregion
    }
}
